/*
* ============================================================================
* 功能描述 ：应用层配置
* 作者       ：ggls
* 创建日期 ：2024.04.10
* ----------------------------------------------------------------------------
* 更新历史 ：
*	日期 　　- 修改者   : 更新内容描述
*
* ============================================================================
*/

#include "main.h"
#include <stdio.h>


app_data_s app_data;
date_time_t data1;

bit alarm_temp_f;
bit io_wk_up;
bit buzz_kg =0;
bit buzz_on;
char zigbee_Presence = 0;
bit alarm_temp_gd = 0;
bit alarm_humi_gd = 0;
char alarm_temp;

#if 0
static void _temp_handle(signed short t, signed short h)
{
	unsigned char t10 = 0, t100 = 0, t1000 = 0;
	unsigned char h10 = 0, h100 = 0, h1000 = 0;
	
	t10 	= (t/10%10);		// 十位位
	t100 	= (t/100%10);		// 百位
	t1000 	= (t/1000);			// 千位
	DelayXms(2);
//	t_10 	= _temp_lcd(t10);
//	t_100 	= _temp_lcd(t100);
//	t_1000 	= _temp_lcd(t1000);

	j1  = SHORT_GET_HIGH_BYTE(h);
	j2  = SHORT_GET_LOW_BYTE(h);
	
	j  = j1*256+j2;

	h10		= (j/100%10); 		// bai位
	h100	= (j/1000%10);		// qian位	
	h1000	= (j/10000%10);		// wan位
	DelayXms(2);
//	h_10	= _temp_lcd(h10);
//	h_100	= _temp_lcd(h100);
//	h_1000	= _temp_lcd(h1000);

//	hp[0] = SHORT_GET_HIGH_BYTE(h_10);
//	hp[1] = SHORT_GET_LOW_BYTE(h_10);
//	hp[2] = SHORT_GET_HIGH_BYTE(h_100);
//	hp[3] = SHORT_GET_LOW_BYTE(h_100);
//	hp[4] = SHORT_GET_HIGH_BYTE(h_1000);
//	hp[5] = SHORT_GET_LOW_BYTE(h_1000);
	if(t1000 == 1)
	{
		if(t100 <= 8 )
		{
			if(h1000 == 4 || h1000 == 5)
			{
				Write_Lcd_Storage(face_state,1);
			}
			else if(h1000 == 6)
			{
				if(h100 < 5)
				{
					Write_Lcd_Storage(face_state,1);
				}
				else
					Write_Lcd_Storage(face_state,0);
			}
			else
				Write_Lcd_Storage(face_state,0);
		}
		else
			Write_Lcd_Storage(face_state,0);
	}
	else if(t1000 == 2)
	{
		if(t100 <= 8)
		{
			if(h1000 == 4 || h1000 == 5)
			{
				Write_Lcd_Storage(face_state,1);
			}
			else if(h1000 == 6)
			{
				if(h100 < 5)
				{
					Write_Lcd_Storage(face_state,1);
				}
				else
					Write_Lcd_Storage(face_state,0);
			}
			else
				Write_Lcd_Storage(face_state,0);
		}
		else
			Write_Lcd_Storage(face_state,0);
	}
	else
		Write_Lcd_Storage(face_state,0);
	
#if 0
	char a1[2],a2[2],a3[2];
	a1[0] = h10;
	a2[0] = h100;
	a3[0] = h1000;
	DelayXms(200);
	Uart_Tx_buf(a1, 1);		// 打印每一位值
	DelayXms(200);
	Uart_Tx_buf(a2, 1);
	DelayXms(200);
	Uart_Tx_buf(a3, 1);
#endif
	//Lcd_Set_temp(t_1000, t_100, t_10);
	Write_Lcd_Storage(temp_1,t10);
	DelayXms(2);
	Write_Lcd_Storage(temp_10,t100);
	DelayXms(2);
	Write_Lcd_Storage(temp_100,t1000);
	DelayXms(2);
	Write_Lcd_Storage(hum_10,h100);
	DelayXms(2);
	Write_Lcd_Storage(hum_100,h1000);
	Seg_Set_Data();
}
#endif

static void _LCD_Refresh(s16 t, s16 h)
{
    // 提取温度和湿度的位值
    
    unsigned char t1 = 0, t10 = 0, t100 = 0;
    unsigned char h10, h100, h1;
		

	
	h10 	= (h%10);		// bai位
	h100	= (h/10%10);		// qian位	

	if( t <= 1000 )
	{
	 	Write_Lcd_Storage(temp_hun, 0);
	}
	if( t > 1000 && t < 2000)
	{
	 	Write_Lcd_Storage(temp_hun, 1);
	}
	if( t >= 2000)
	{
	 	Write_Lcd_Storage(temp_up, 1);
	}
	if( t >= 0 && t < 2000)
	{
		t1 = t % 10; 
		t10 = t / 10 % 10; 
		t100 = t / 100 % 10;
			

	 	Write_Lcd_Storage(temp_1, t1);
	 	Write_Lcd_Storage(temp_10, t10);
		Write_Lcd_Storage(temp_100, t100);		
	}
	if( t < 0 && t > -100)
	{
		t = abs(t);
		t1 = t % 10; 
		t10 = t / 10 % 10; 
		Write_Lcd_Storage(temp_1, t1);
	 	Write_Lcd_Storage(temp_10, t10);
	 	Write_Lcd_Storage(temp_loss, 0);
	}
	else if(t <= -100)
	{
	 	Write_Lcd_Storage(temp_err, 0);
	}
	if( h < 100)
	{
		Write_Lcd_Storage(hum_10, h10);
		Write_Lcd_Storage(hum_100, h100);
	}
	if(h >= 100)
	{
	 	Write_Lcd_Storage(humi_err, 0);

	}

    // 旧代码注释已移除，如果需要调试或输出，可以重新启用
#if 0

    // Debugging or output code
    char a1[2], a2[2], a3[2];
    a1[0] = h10;
    a2[0] = h100;
    a3[0] = h1000;
    DelayXms(200);
    Uart_Tx_buf(a1, 1);
    DelayXms(200);
    Uart_Tx_buf(a2, 1);
    DelayXms(200);
    Uart_Tx_buf(a3, 1);
#endif

    Seg_Set_Data();
}

static void _app_temp_humi_alarm(void)
{
	if(app_data.temp >= app_data.upper_limit_temp)	// 高温报警
	{
		alarm_temp_f = 1;
		alarm_temp_gd = 1;
		Zigbee_wake_up();
		delayms(15);
		Hly_tuya_updata(DPID_TEMP_ALARM, upperalarm,1, DP_TYPE_ENUM);		
		
		Zigbee_sleep();
	}
	if(app_data.temp <= app_data.lower_limit_temp)	// 低温报警
	{
		alarm_temp_f = 1;
		alarm_temp_gd = 1;
		Zigbee_wake_up();
		delayms(15);
		Hly_tuya_updata(DPID_TEMP_ALARM, loweralarm,1, DP_TYPE_ENUM);		
		Zigbee_sleep();
	}
	if(alarm_temp_gd == 1)
	{
		if(app_data.temp > app_data.lower_limit_temp && app_data.temp < app_data.upper_limit_temp)
		{
			Zigbee_wake_up();
			delayms(15);
			Hly_tuya_updata(DPID_TEMP_ALARM, cancel,1, DP_TYPE_ENUM);		
			Zigbee_sleep();
			alarm_temp_gd = 0;
		}
	}

	if(app_data.hum >= app_data.upper_limit_hum)	// 高湿度报警
	{
		alarm_humi_gd = 1;
		Zigbee_wake_up();
		delayms(15);
		Hly_tuya_updata(DPID_HUM_ALARM, upperalarm,1, DP_TYPE_ENUM);		
		Zigbee_sleep();
	}
	if(app_data.hum <= app_data.lower_limit_hum)	// 低湿度报警
	{
		alarm_humi_gd = 1;
		Zigbee_wake_up();
		delayms(15);
		Hly_tuya_updata(DPID_HUM_ALARM, loweralarm,1, DP_TYPE_ENUM);		
		Zigbee_sleep();
	}
	if(alarm_humi_gd == 1)
	{
		if(app_data.hum > app_data.lower_limit_hum && app_data.hum < app_data.upper_limit_hum)
		{
		
			alarm_humi_gd = 0;
			Zigbee_wake_up();
			delayms(15);
			Hly_tuya_updata(DPID_HUM_ALARM, cancel,1, DP_TYPE_ENUM);		
			Zigbee_sleep();
			alarm_temp_gd = 0;
		}
	}

}

void _app_temp_unit(void)
{
	signed short f;

	if(unit_flag == 0)
	{
		// 处理温湿度的每一位值			
		Write_Lcd_Storage(temp_unit, 0);
		_LCD_Refresh(app_data.temp, app_data.hum);
	
	}
	if(unit_flag == 1)
	{
	
		Write_Lcd_Storage(temp_unit, 1);
		f = 9*app_data.temp/5+320; 
		_LCD_Refresh(f, app_data.hum);
	}


}

static void _app_face_stat(void)
{
	// 设置面部状态
   if (app_data.temp >= 180 && app_data.temp <= 280)
   {
		Write_Lcd_Storage(face_state, 1);
   } 
   else 
   {
	  	Write_Lcd_Storage(face_state, 0);
   }

}
static void _app_ctx_init(void)
{
	if(app_data.upper_limit_hum <= 0 || app_data.upper_limit_hum > 100) // 	判断湿度上限是否合法
	{
		app_data.upper_limit_hum = 100;
	}
	if(app_data.lower_limit_hum <= 0 || app_data.lower_limit_hum > 100) //	判断湿度下限是否合法
	{
		app_data.lower_limit_hum = 0;
		
	}
	if(app_data.lower_limit_temp < -200 || app_data.lower_limit_temp > 600) //	判断温度下限是否合法
	{
		app_data.lower_limit_temp = -200;
	}
	if(app_data.upper_limit_temp <= 0 || app_data.upper_limit_temp > 600) //	判断温度上限是否合法
	{
		app_data.upper_limit_temp = 600;
	}
	if(app_data.humi_sensitivity < 5 || app_data.humi_sensitivity > 10)	// 湿度灵敏度是否合法
	{
		app_data.humi_sensitivity = 5;
	}
	if(app_data.temp_sensitivity < 5 || app_data.temp_sensitivity > 50)	// 温度灵敏度是否合法
	{
		app_data.temp_sensitivity = 5;
	}

}

void Hly_button_Event(void)
{
    signed short f, t, h;
	int temp_data, humi_data;
	Hly_Temp_Hum_Updata();
	delayms(10);

	t = app_data.temp;  // 获取温度

	h = app_data.hum;	// 获取湿度

	temp_data = t;
	humi_data = h;
	Hly_tuya_updata(humidity_value, humi_data, 4, DP_TYPE_VALUE);
	delayms(2);

	Hly_tuya_updata(temp_current, temp_data, 4, DP_TYPE_VALUE);
	
//	Hly_Packet_device_manage(report_specified_type, 6, t, 0);		// zigbee上报温度
//	delayms(2);
//	Hly_Packet_device_manage(report_specified_type, 6, h, 1);		// zigbee上报湿度
	
	_app_temp_unit();
    	app_data.last_hum = app_data.hum;
	app_data.last_temp = app_data.temp;
}

void app_Temp_Hum_cj(void)
{
	s16 t, h;
	unsigned char Data_f;
	Data_f = SHT4XReadTemperatureAndHumidity(&t, &h); // 获取温湿度	
	if (Data_f == 1) 
	{
	
		if(t >= -4000 && t <= 12500)
		{
			app_data.temp = t/10;
		}
		else
		{
			app_data.temp = 2000;

		}
		if(h >= 0 && h <= 10000)
		{
			app_data.hum = h/100;
		}
		else
		{
			app_data.hum = 99;

		}
	}


}

void Hly_Temp_Hum_Updata(void)
{

	s16 t, h;
    unsigned char Data_f;
	char ch[5];
  	Data_f = SHT4XReadTemperatureAndHumidity(&t, &h); // 获取温湿度	
  	
	if (Data_f == 1) 
	{

		if(t >= -4000 && t <= 12500)
		{
			app_data.temp = t/10;
		}
		else
		{
			app_data.temp = 2000;

		}
		if(h >= 0 && h <= 10000)
		{
			app_data.hum = h/100;
		}
		else
		{
			app_data.hum = 99;

		}
		if(abs(app_data.last_hum - app_data.hum) > app_data.humi_sensitivity || abs(app_data.last_temp - app_data.temp) > app_data.temp_sensitivity)
		{
			app_data.last_hum = app_data.hum;
			app_data.last_temp = app_data.temp;
			_app_face_stat();
			
			_app_temp_unit();

			Zigbee_wake_up();
			delayms(15);
			Hly_tuya_updata(humidity_value, app_data.hum, 4, DP_TYPE_VALUE);
			delayms(20);

			Hly_tuya_updata(temp_current, app_data.temp, 4, DP_TYPE_VALUE);
			Zigbee_sleep();
		}
	}
}


/***********************************************
函数名称：Hly_stamp_to_time
函数功能：时间戳转化为日期
入口参数： [in] date 日期值
出口参数：=0 成功 非0 失败，以及失败原因
备注：
************************************************/
unsigned int Hly_stamp_to_time(u32 timep, date_time_t *time)
{
	u32  rem = 0;

	// 北京时间补偿
	timep = timep + 8*60*60;
	
	rem = (u32 )(timep % 86400);

	// 计算时间
	time->hour = rem / 3600;
	rem %= 3600;
	time->min = rem  / 60;
	time->sec = rem % 60;
	return 0;
}

void app_update_time(unsigned char *f_data, char lenthg) // 时间戳数据获取
{
	u32 t_val1, t_val2, t_val3, t_val4, t_val;
	sj_f = 1;
	
	t_val1 = (u32)f_data[12] << 24  ;	// 前两位
	t_val2 = (u32)f_data[13] << 16  ;					// 后两位
	t_val3 = (u32)f_data[14] << 8  ;
	t_val4 = (u32)f_data[15];

	t_val = t_val1 + t_val2 + t_val3 + t_val4 + 946656000;					 // 时间搓
	
//	t_val = 1720407981;						

//	Uart_Tx_buf(ch, 5);						 // 打印
	Hly_stamp_to_time(t_val, &data1);	// 时间搓转换
	hly_time_start();
	
}

void App_ZigbeeData_Receive_handle(unsigned char *f_data, char lenthg)
{
	if(f_data[11] == temp_unit_convert)	// 温度单位处理
	{
		unit_flag = f_data[15];
		Hly_Packet_device_manage(dpid_back, 1, 0, 3);
		_app_temp_unit();
	}
	if(f_data[11] == maxtemp_set)	// 设置温度上限
	{
		app_data.upper_limit_temp = (f_data[15]*256*256*256)+(f_data[16]*256*256)+(f_data[17]*256)+(f_data[18]);
		Hly_Packet_device_manage(dpid_back, 1, 0, 3);
	}
	if(f_data[11] == minitemp_set)	// 设置温度下限
	{	
		app_data.lower_limit_temp = (f_data[15]*256*256*256)+(f_data[16]*256*256)+(f_data[17]*256)+(f_data[18]);
		Hly_Packet_device_manage(dpid_back, 1, 0, 3);
	}
	if(f_data[11] == maxhum_set)	// 设置湿度上限
	{	
		app_data.upper_limit_hum = (f_data[15]*256*256*256)+(f_data[16]*256*256)+(f_data[17]*256)+(f_data[18]);
		Hly_Packet_device_manage(dpid_back, 1, 0, 3);
	}
	if(f_data[11] == minihum_set)	// 设置湿度下限
	{	
		app_data.lower_limit_hum = (f_data[15]*256*256*256)+(f_data[16]*256*256)+(f_data[17]*256)+(f_data[18]);
		Hly_Packet_device_manage(dpid_back, 1, 0, 3);
	}
	if(f_data[11] == temp_periodic_report)	// 设置温度上报间隔
	{
		
	}
	if(f_data[11] == hum_periodic_report)	// 设置湿度上报间隔
	{
		
	}
	if(f_data[11] == temp_sensitivity)	// 设置温度灵敏度
	{
		app_data.temp_sensitivity = (f_data[15]*256*256*256)+(f_data[16]*256*256)+(f_data[17]*256)+(f_data[18]);
		Hly_Packet_device_manage(dpid_back, 1, 0, 3);
		
	}
	if(f_data[11] == hum_sensitivity)	// 设置湿度灵敏度
	{
		app_data.humi_sensitivity = (f_data[15]*256*256*256)+(f_data[16]*256*256)+(f_data[17]*256)+(f_data[18]);
		Hly_Packet_device_manage(dpid_back, 1, 0, 3);
	}
}

void App_Run(void)
{
	//hly_time_start();
	Zigbee_Cmd_handle();
	
	Zigbee_Config_Set();

	if(hly_get_elapsed_s(app_data.last_up_time) >= 10)
	{
		app_data.last_up_time = get_current_s();
		_app_temp_humi_alarm();
		Hly_Temp_Hum_Updata();
	//	SYS_EnterStop();


	}
	if(hly_get_elapsed_s(app_data.query_interval) >= 3600)
	{
		app_data.query_interval = get_current_s();
		Zigbee_wake_up();
		delayms(15);
		Hly_button_Event();
		delayms(200);
		Hly_Packet_device_manage(get_specified_properties, 3, 1, 2);						// 获取时间
		delayms(200);
		Hly_Packet_Network_msg(query_current_network_status, 0, 0);
		delayms(200);
		hly_Obtain_voltage();
		delayms(200);
		Hly_tuya_updata(DPID_BATTERY_PERCENTAGE, app_data.power_supply,4, DP_TYPE_VALUE);		
		Zigbee_sleep();
		if(app_data.power_supply < 20)
		{
			Write_Lcd_Storage(LOW_BATTERY, 1);		
		}
		if(app_data.power_supply >= 20)
		{
			Write_Lcd_Storage(LOW_BATTERY, 0);		
		}
			
	}
	if(hly_get_elapsed_s(app_data.time_val) >= 1)
	{
		app_data.time_val = get_current_s();
		if(sj_f == 1)
		{
			hly_time_start();
		}


	}
	if(io_wk_up == 1)
	{
		if(hly_get_elapsed_ms(app_data.wake_up_time) >= 2000)
		{
			app_data.wake_up_time = get_current_ms();
			io_wk_up = 0;

		}
	}	
	if(alarm_temp_f == 1)
		{
			if(hly_get_elapsed_ms(app_data.buzz_time) >= 500)
			{
				app_data.buzz_time = get_current_ms();
				if(buzz_kg == 0)
				{
					BUZ_EnableBuzzer(); 
					buzz_kg = 1;
				}
				else if(buzz_kg == 1)
				{
					BUZ_DisableBuzzer();
					buzz_kg = 0;
					buzz_on = 1;
					alarm_temp ++;
				}
	
			}
			if(alarm_temp == 2)
			{
				alarm_temp_f = 0;
				buzz_on = 0;
				alarm_temp = 0;
			}
			
		}

}

void app_init(void)
{
	_app_ctx_init();
	alarm_temp_f = 0;
	io_wk_up = 0;
//	Hly_Temp_Hum_Obtain();
}

